home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / python2.4 / idlelib / TreeWidget.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2005-10-18  |  16KB  |  549 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.4)
  3.  
  4. import os
  5. import sys
  6. from Tkinter import *
  7. import imp
  8. import ZoomHeight
  9. from configHandler import idleConf
  10. ICONDIR = 'Icons'
  11.  
  12. try:
  13.     _icondir = os.path.join(os.path.dirname(__file__), ICONDIR)
  14. except NameError:
  15.     _icondir = ICONDIR
  16.  
  17. if os.path.isdir(_icondir):
  18.     ICONDIR = _icondir
  19. elif not os.path.isdir(ICONDIR):
  20.     raise RuntimeError, "can't find icon directory (%r)" % (ICONDIR,)
  21.  
  22.  
  23. def listicons(icondir = ICONDIR):
  24.     '''Utility to display the available icons.'''
  25.     root = Tk()
  26.     import glob as glob
  27.     list = glob.glob(os.path.join(icondir, '*.gif'))
  28.     list.sort()
  29.     images = []
  30.     row = column = 0
  31.     for file in list:
  32.         name = os.path.splitext(os.path.basename(file))[0]
  33.         image = PhotoImage(file = file, master = root)
  34.         images.append(image)
  35.         label = Label(root, image = image, bd = 1, relief = 'raised')
  36.         label.grid(row = row, column = column)
  37.         label = Label(root, text = name)
  38.         label.grid(row = row + 1, column = column)
  39.         column = column + 1
  40.         if column >= 10:
  41.             row = row + 2
  42.             column = 0
  43.             continue
  44.     
  45.     root.images = images
  46.  
  47.  
  48. class TreeNode:
  49.     
  50.     def __init__(self, canvas, parent, item):
  51.         self.canvas = canvas
  52.         self.parent = parent
  53.         self.item = item
  54.         self.state = 'collapsed'
  55.         self.selected = False
  56.         self.children = []
  57.         self.x = None
  58.         self.y = None
  59.         self.iconimages = { }
  60.  
  61.     
  62.     def destroy(self):
  63.         for c in self.children[:]:
  64.             self.children.remove(c)
  65.             c.destroy()
  66.         
  67.         self.parent = None
  68.  
  69.     
  70.     def geticonimage(self, name):
  71.         
  72.         try:
  73.             return self.iconimages[name]
  74.         except KeyError:
  75.             pass
  76.  
  77.         (file, ext) = os.path.splitext(name)
  78.         if not ext:
  79.             pass
  80.         ext = '.gif'
  81.         fullname = os.path.join(ICONDIR, file + ext)
  82.         image = PhotoImage(master = self.canvas, file = fullname)
  83.         self.iconimages[name] = image
  84.         return image
  85.  
  86.     
  87.     def select(self, event = None):
  88.         if self.selected:
  89.             return None
  90.         
  91.         self.deselectall()
  92.         self.selected = True
  93.         self.canvas.delete(self.image_id)
  94.         self.drawicon()
  95.         self.drawtext()
  96.  
  97.     
  98.     def deselect(self, event = None):
  99.         if not self.selected:
  100.             return None
  101.         
  102.         self.selected = False
  103.         self.canvas.delete(self.image_id)
  104.         self.drawicon()
  105.         self.drawtext()
  106.  
  107.     
  108.     def deselectall(self):
  109.         if self.parent:
  110.             self.parent.deselectall()
  111.         else:
  112.             self.deselecttree()
  113.  
  114.     
  115.     def deselecttree(self):
  116.         if self.selected:
  117.             self.deselect()
  118.         
  119.         for child in self.children:
  120.             child.deselecttree()
  121.         
  122.  
  123.     
  124.     def flip(self, event = None):
  125.         if self.state == 'expanded':
  126.             self.collapse()
  127.         else:
  128.             self.expand()
  129.         self.item.OnDoubleClick()
  130.         return 'break'
  131.  
  132.     
  133.     def expand(self, event = None):
  134.         if not self.item._IsExpandable():
  135.             return None
  136.         
  137.         if self.state != 'expanded':
  138.             self.state = 'expanded'
  139.             self.update()
  140.             self.view()
  141.         
  142.  
  143.     
  144.     def collapse(self, event = None):
  145.         if self.state != 'collapsed':
  146.             self.state = 'collapsed'
  147.             self.update()
  148.         
  149.  
  150.     
  151.     def view(self):
  152.         top = self.y - 2
  153.         bottom = self.lastvisiblechild().y + 17
  154.         height = bottom - top
  155.         visible_top = self.canvas.canvasy(0)
  156.         visible_height = self.canvas.winfo_height()
  157.         visible_bottom = self.canvas.canvasy(visible_height)
  158.         if visible_top <= top and bottom <= visible_bottom:
  159.             return None
  160.         
  161.         (x0, y0, x1, y1) = self.canvas._getints(self.canvas['scrollregion'])
  162.         if top >= visible_top and height <= visible_height:
  163.             fraction = top + height - visible_height
  164.         else:
  165.             fraction = top
  166.         fraction = float(fraction) / y1
  167.         self.canvas.yview_moveto(fraction)
  168.  
  169.     
  170.     def lastvisiblechild(self):
  171.         if self.children and self.state == 'expanded':
  172.             return self.children[-1].lastvisiblechild()
  173.         else:
  174.             return self
  175.  
  176.     
  177.     def update(self):
  178.         if self.parent:
  179.             self.parent.update()
  180.         else:
  181.             oldcursor = self.canvas['cursor']
  182.             self.canvas['cursor'] = 'watch'
  183.             self.canvas.update()
  184.             self.canvas.delete(ALL)
  185.             self.draw(7, 2)
  186.             (x0, y0, x1, y1) = self.canvas.bbox(ALL)
  187.             self.canvas.configure(scrollregion = (0, 0, x1, y1))
  188.             self.canvas['cursor'] = oldcursor
  189.  
  190.     
  191.     def draw(self, x, y):
  192.         self.x = x
  193.         self.y = y
  194.         self.drawicon()
  195.         self.drawtext()
  196.         if self.state != 'expanded':
  197.             return y + 17
  198.         
  199.         if not self.children:
  200.             sublist = self.item._GetSubList()
  201.             if not sublist:
  202.                 return y + 17
  203.             
  204.             for item in sublist:
  205.                 child = self.__class__(self.canvas, self, item)
  206.                 self.children.append(child)
  207.             
  208.         
  209.         cx = x + 20
  210.         cy = y + 17
  211.         cylast = 0
  212.         for child in self.children:
  213.             cylast = cy
  214.             self.canvas.create_line(x + 9, cy + 7, cx, cy + 7, fill = 'gray50')
  215.             cy = child.draw(cx, cy)
  216.             if child.item._IsExpandable():
  217.                 if child.state == 'expanded':
  218.                     iconname = 'minusnode'
  219.                     callback = child.collapse
  220.                 else:
  221.                     iconname = 'plusnode'
  222.                     callback = child.expand
  223.                 image = self.geticonimage(iconname)
  224.                 id = self.canvas.create_image(x + 9, cylast + 7, image = image)
  225.                 self.canvas.tag_bind(id, '<1>', callback)
  226.                 self.canvas.tag_bind(id, '<Double-1>', (lambda x: pass))
  227.                 continue
  228.         
  229.         id = self.canvas.create_line(x + 9, y + 10, x + 9, cylast + 7, fill = 'gray50')
  230.         self.canvas.tag_lower(id)
  231.         return cy
  232.  
  233.     
  234.     def drawicon(self):
  235.         imagename = None if self.selected else 'folder'
  236.         image = self.geticonimage(imagename)
  237.         id = self.canvas.create_image(self.x, self.y, anchor = 'nw', image = image)
  238.         self.image_id = id
  239.         self.canvas.tag_bind(id, '<1>', self.select)
  240.         self.canvas.tag_bind(id, '<Double-1>', self.flip)
  241.  
  242.     
  243.     def drawtext(self):
  244.         textx = self.x + 20 - 1
  245.         texty = self.y - 1
  246.         labeltext = self.item.GetLabelText()
  247.         if labeltext:
  248.             id = self.canvas.create_text(textx, texty, anchor = 'nw', text = labeltext)
  249.             self.canvas.tag_bind(id, '<1>', self.select)
  250.             self.canvas.tag_bind(id, '<Double-1>', self.flip)
  251.             (x0, y0, x1, y1) = self.canvas.bbox(id)
  252.             textx = max(x1, 200) + 10
  253.         
  254.         if not self.item.GetText():
  255.             pass
  256.         text = '<no text>'
  257.         
  258.         try:
  259.             self.entry
  260.         except AttributeError:
  261.             pass
  262.  
  263.         self.edit_finish()
  264.         
  265.         try:
  266.             label = self.label
  267.         except AttributeError:
  268.             self.label = Label(self.canvas, text = text, bd = 0, padx = 2, pady = 2)
  269.  
  270.         theme = idleConf.GetOption('main', 'Theme', 'name')
  271.         if self.selected:
  272.             self.label.configure(idleConf.GetHighlight(theme, 'hilite'))
  273.         else:
  274.             self.label.configure(idleConf.GetHighlight(theme, 'normal'))
  275.         id = self.canvas.create_window(textx, texty, anchor = 'nw', window = self.label)
  276.         self.label.bind('<1>', self.select_or_edit)
  277.         self.label.bind('<Double-1>', self.flip)
  278.         self.text_id = id
  279.  
  280.     
  281.     def select_or_edit(self, event = None):
  282.         if self.selected and self.item.IsEditable():
  283.             self.edit(event)
  284.         else:
  285.             self.select(event)
  286.  
  287.     
  288.     def edit(self, event = None):
  289.         self.entry = Entry(self.label, bd = 0, highlightthickness = 1, width = 0)
  290.         self.entry.insert(0, self.label['text'])
  291.         self.entry.selection_range(0, END)
  292.         self.entry.pack(ipadx = 5)
  293.         self.entry.focus_set()
  294.         self.entry.bind('<Return>', self.edit_finish)
  295.         self.entry.bind('<Escape>', self.edit_cancel)
  296.  
  297.     
  298.     def edit_finish(self, event = None):
  299.         
  300.         try:
  301.             entry = self.entry
  302.             del self.entry
  303.         except AttributeError:
  304.             return None
  305.  
  306.         text = entry.get()
  307.         entry.destroy()
  308.         if text and text != self.item.GetText():
  309.             self.item.SetText(text)
  310.         
  311.         text = self.item.GetText()
  312.         self.label['text'] = text
  313.         self.drawtext()
  314.         self.canvas.focus_set()
  315.  
  316.     
  317.     def edit_cancel(self, event = None):
  318.         
  319.         try:
  320.             entry = self.entry
  321.             del self.entry
  322.         except AttributeError:
  323.             return None
  324.  
  325.         entry.destroy()
  326.         self.drawtext()
  327.         self.canvas.focus_set()
  328.  
  329.  
  330.  
  331. class TreeItem:
  332.     '''Abstract class representing tree items.
  333.  
  334.     Methods should typically be overridden, otherwise a default action
  335.     is used.
  336.  
  337.     '''
  338.     
  339.     def __init__(self):
  340.         '''Constructor.  Do whatever you need to do.'''
  341.         pass
  342.  
  343.     
  344.     def GetText(self):
  345.         '''Return text string to display.'''
  346.         pass
  347.  
  348.     
  349.     def GetLabelText(self):
  350.         '''Return label text string to display in front of text (if any).'''
  351.         pass
  352.  
  353.     expandable = None
  354.     
  355.     def _IsExpandable(self):
  356.         '''Do not override!  Called by TreeNode.'''
  357.         if self.expandable is None:
  358.             self.expandable = self.IsExpandable()
  359.         
  360.         return self.expandable
  361.  
  362.     
  363.     def IsExpandable(self):
  364.         '''Return whether there are subitems.'''
  365.         return 1
  366.  
  367.     
  368.     def _GetSubList(self):
  369.         '''Do not override!  Called by TreeNode.'''
  370.         if not self.IsExpandable():
  371.             return []
  372.         
  373.         sublist = self.GetSubList()
  374.         if not sublist:
  375.             self.expandable = 0
  376.         
  377.         return sublist
  378.  
  379.     
  380.     def IsEditable(self):
  381.         """Return whether the item's text may be edited."""
  382.         pass
  383.  
  384.     
  385.     def SetText(self, text):
  386.         """Change the item's text (if it is editable)."""
  387.         pass
  388.  
  389.     
  390.     def GetIconName(self):
  391.         '''Return name of icon to be displayed normally.'''
  392.         pass
  393.  
  394.     
  395.     def GetSelectedIconName(self):
  396.         '''Return name of icon to be displayed when selected.'''
  397.         pass
  398.  
  399.     
  400.     def GetSubList(self):
  401.         '''Return list of items forming sublist.'''
  402.         pass
  403.  
  404.     
  405.     def OnDoubleClick(self):
  406.         '''Called on a double-click on the item.'''
  407.         pass
  408.  
  409.  
  410.  
  411. class FileTreeItem(TreeItem):
  412.     '''Example TreeItem subclass -- browse the file system.'''
  413.     
  414.     def __init__(self, path):
  415.         self.path = path
  416.  
  417.     
  418.     def GetText(self):
  419.         if not os.path.basename(self.path):
  420.             pass
  421.         return self.path
  422.  
  423.     
  424.     def IsEditable(self):
  425.         return os.path.basename(self.path) != ''
  426.  
  427.     
  428.     def SetText(self, text):
  429.         newpath = os.path.dirname(self.path)
  430.         newpath = os.path.join(newpath, text)
  431.         if os.path.dirname(newpath) != os.path.dirname(self.path):
  432.             return None
  433.         
  434.         
  435.         try:
  436.             os.rename(self.path, newpath)
  437.             self.path = newpath
  438.         except os.error:
  439.             pass
  440.  
  441.  
  442.     
  443.     def GetIconName(self):
  444.         if not self.IsExpandable():
  445.             return 'python'
  446.         
  447.  
  448.     
  449.     def IsExpandable(self):
  450.         return os.path.isdir(self.path)
  451.  
  452.     
  453.     def GetSubList(self):
  454.         
  455.         try:
  456.             names = os.listdir(self.path)
  457.         except os.error:
  458.             return []
  459.  
  460.         names.sort((lambda a, b: cmp(os.path.normcase(a), os.path.normcase(b))))
  461.         sublist = []
  462.         for name in names:
  463.             item = FileTreeItem(os.path.join(self.path, name))
  464.             sublist.append(item)
  465.         
  466.         return sublist
  467.  
  468.  
  469.  
  470. class ScrolledCanvas:
  471.     
  472.     def __init__(self, master, **opts):
  473.         if not opts.has_key('yscrollincrement'):
  474.             opts['yscrollincrement'] = 17
  475.         
  476.         self.master = master
  477.         self.frame = Frame(master)
  478.         self.frame.rowconfigure(0, weight = 1)
  479.         self.frame.columnconfigure(0, weight = 1)
  480.         self.canvas = Canvas(self.frame, **opts)
  481.         self.canvas.grid(row = 0, column = 0, sticky = 'nsew')
  482.         self.vbar = Scrollbar(self.frame, name = 'vbar')
  483.         self.vbar.grid(row = 0, column = 1, sticky = 'nse')
  484.         self.hbar = Scrollbar(self.frame, name = 'hbar', orient = 'horizontal')
  485.         self.hbar.grid(row = 1, column = 0, sticky = 'ews')
  486.         self.canvas['yscrollcommand'] = self.vbar.set
  487.         self.vbar['command'] = self.canvas.yview
  488.         self.canvas['xscrollcommand'] = self.hbar.set
  489.         self.hbar['command'] = self.canvas.xview
  490.         self.canvas.bind('<Key-Prior>', self.page_up)
  491.         self.canvas.bind('<Key-Next>', self.page_down)
  492.         self.canvas.bind('<Key-Up>', self.unit_up)
  493.         self.canvas.bind('<Key-Down>', self.unit_down)
  494.         self.canvas.bind('<Alt-Key-2>', self.zoom_height)
  495.         self.canvas.focus_set()
  496.  
  497.     
  498.     def page_up(self, event):
  499.         self.canvas.yview_scroll(-1, 'page')
  500.         return 'break'
  501.  
  502.     
  503.     def page_down(self, event):
  504.         self.canvas.yview_scroll(1, 'page')
  505.         return 'break'
  506.  
  507.     
  508.     def unit_up(self, event):
  509.         self.canvas.yview_scroll(-1, 'unit')
  510.         return 'break'
  511.  
  512.     
  513.     def unit_down(self, event):
  514.         self.canvas.yview_scroll(1, 'unit')
  515.         return 'break'
  516.  
  517.     
  518.     def zoom_height(self, event):
  519.         ZoomHeight.zoom_height(self.master)
  520.         return 'break'
  521.  
  522.  
  523.  
  524. def test():
  525.     import PyShell as PyShell
  526.     root = Toplevel(PyShell.root)
  527.     root.configure(bd = 0, bg = 'yellow')
  528.     root.focus_set()
  529.     sc = ScrolledCanvas(root, bg = 'white', highlightthickness = 0, takefocus = 1)
  530.     sc.frame.pack(expand = 1, fill = 'both')
  531.     item = FileTreeItem('C:/windows/desktop')
  532.     node = TreeNode(sc.canvas, None, item)
  533.     node.expand()
  534.  
  535.  
  536. def test2():
  537.     root = Tk()
  538.     root.configure(bd = 0)
  539.     canvas = Canvas(root, bg = 'white', highlightthickness = 0)
  540.     canvas.pack(expand = 1, fill = 'both')
  541.     item = FileTreeItem(os.curdir)
  542.     node = TreeNode(canvas, None, item)
  543.     node.update()
  544.     canvas.focus_set()
  545.  
  546. if __name__ == '__main__':
  547.     test()
  548.  
  549.